package Sintactico;
import java.util.ArrayList;
import java.util.HashMap;

import Sintactico.TinyGA.Clase;
import Tipos.Tipo;


public class TS {
	private static ArrayList<Tabla> ts = new ArrayList<Tabla>();
	private static int nivelActual = 0;
	
	public TS() {
		creaNivel();
	}
	
	public void creaNivel(){
		ts.add(new Tabla(nivelActual));
		nivelActual++;
	}
	
	public void aniadeSimb(String nombre, Clase clase, Tipo tipo, Integer dir,
			Integer nivel) {
		Propiedad prop = new Propiedad(clase, dir, tipo, nivel);
		ts.get(nivel).getTabla().put(nombre, prop);
	}
	
	public boolean existeSimbUlt(String iden){
		return ts.get(nivelActual-1).getTabla().containsKey(iden);
	}
	
	public Propiedad getPropiedades(String iden){
		if (existeSimbUlt(iden)){
			return ts.get(nivelActual-1).getTabla().get(iden);
		}
		else {
			int contador = nivelActual-2;
			for (int i=contador; i>=0; i--){
				if (ts.get(i).getTabla().containsKey(iden)){
					return ts.get(i).getTabla().get(iden);
				}
			}
			return null;
		}
	}
	
	public Tipo tipoDe(String iden){
		Propiedad p = getPropiedades(iden);
		if (p!=null){
			return p.getTipo();
		}
		else return null;
	}
	
	public class Tabla {
		private int nivel;
		private HashMap<String, Propiedad> tabla;
		

		public Tabla(int nivel) {
			tabla = new HashMap<String, Propiedad>();
			this.nivel = nivel;
		}
		
		public int getNivel() {
			return nivel;
		}
		public void setNivel(int nivel) {
			this.nivel = nivel;
		}
		public HashMap<String, Propiedad> getTabla() {
			return tabla;
		}
		
	}
	
	public class Propiedad {
		
		private Clase clase;
		private int dir;
		private Tipo tipo;
		private int nivel;
		
		public Propiedad(Clase clase, int dir, Tipo tipo, int nivel) {
			this.clase = clase;
			this.dir = dir;
			this.tipo = tipo;
			this.nivel = nivel;
		}

		public Clase getClase() {
			return clase;
		}

		public void setClase(Clase clase) {
			this.clase = clase;
		}

		public int getDir() {
			return dir;
		}

		public void setDir(int dir) {
			this.dir = dir;
		}

		public Tipo getTipo() {
			return tipo;
			
		}

		public void setTipo(Tipo tipo) {
			this.tipo = tipo;
		}

		public int getNivel() {
			return nivel;
		}

		public void setNivel(int nivel) {
			this.nivel = nivel;
		}
				
	}

	


}



/*public class TS {
   public TS() {
     tabla = new HashMap<String,String>();   
   }
   private TS(Map<String,String> tabla) {
     this.tabla = tabla;  
   }
   public boolean estaEn(String cte) {
      return tabla.containsKey(cte); 
   }
   public TS aniade(String cte,String val) {
       tabla.put(cte,val);
       return this;
   }
   public String valDe(String cte) {
       return tabla.get(cte);
   }
   public String toString() {
       return tabla.toString();
   }
   private Map<String,String> tabla; 
    
}*/
